From 99a2107ffafbf0a3d9f079ebd36ad051daa85857 Mon Sep 17 00:00:00 2001 From: "cl349@firebug.cl.cam.ac.uk" Date: Fri, 17 Jun 2005 14:20:55 +0000 Subject: [PATCH] bitkeeper revision 1.1713.3.6 (42b2dc47kgG53fAZb70R3lHX96n7dw) xsobj.py: Handle attribute lookups for non-existing attributes. Use setAttr consistently. Fix access to data in convertFromDB. console.py: Cleanup whitespace. channel.py: Cleanup saveToDB. blkif.py: Save dev_handle in DB. image.py: Cleanup exportToDB. XendDomainInfo.py: Cleanup {save,export}toDB use. Cleanup whitespace. Change id type to be int. Output store_mfn in sxpr. Use id variable name consistently for domain id's. Add eventChannel comment. On restore, the uuid must be known. Signed-off-by: Mike Wray Signed-off-by: Christian Limpach --- tools/python/xen/xend/XendDomainInfo.py | 77 ++++++++++++------------- tools/python/xen/xend/image.py | 4 +- tools/python/xen/xend/server/blkif.py | 1 + tools/python/xen/xend/server/channel.py | 8 +-- tools/python/xen/xend/server/console.py | 3 +- tools/python/xen/xend/xenstore/xsobj.py | 29 ++++++---- 6 files changed, 64 insertions(+), 58 deletions(-) diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index 16415d78a7..f14756015f 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -157,7 +157,7 @@ class XendDomainInfo: db = parentdb.addChild(uuid) vm = cls(db) vm.construct(config) - vm.saveDB(sync=True) + vm.saveToDB(sync=True) return vm create = classmethod(create) @@ -193,7 +193,7 @@ class XendDomainInfo: recreate = classmethod(recreate) - def restore(cls, parentdb, config, uuid=None): + def restore(cls, parentdb, config, uuid): """Create a domain and a VM object to do a restore. @param parentdb: parent db @@ -202,16 +202,20 @@ class XendDomainInfo: """ db = parentdb.addChild(uuid) vm = cls(db) - dom = xc.domain_create() - vm.setdom(dom) - vm.dom_construct(vm.id, config) - vm.saveDB(sync=True) + id = xc.domain_create() + vm.setdom(id) + try: + vm.restore = True + vm.construct(config) + finally: + vm.restore = False + vm.exportToDB(save=True, sync=True) return vm restore = classmethod(restore) __exports__ = [ - DBVar('id', ty='str'), + DBVar('id', ty='int'), DBVar('name', ty='str'), DBVar('uuid', ty='str'), DBVar('config', ty='sxpr'), @@ -267,14 +271,17 @@ class XendDomainInfo: def setDB(self, db): self.db = db - def saveDB(self, save=False, sync=False): + def saveToDB(self, save=False, sync=False): self.db.saveDB(save=save, sync=sync) def exportToDB(self, save=False, sync=False): if self.channel: - self.channel.saveToDB(self.db.addChild("channel")) + self.channel.saveToDB(self.db.addChild("channel"), save=save) if self.store_channel: - self.store_channel.saveToDB(self.db.addChild("store_channel")) + self.store_channel.saveToDB(self.db.addChild("store_channel"), + save=save) + if self.image: + self.image.exportToDB(save=save, sync=sync) self.db.exportToDB(self, fields=self.__exports__, save=save, sync=sync) def importFromDB(self): @@ -316,7 +323,7 @@ class XendDomainInfo: self.state = state self.state_updated.notifyAll() self.state_updated.release() - self.saveDB() + self.saveToDB() def state_wait(self, state): self.state_updated.acquire() @@ -325,14 +332,14 @@ class XendDomainInfo: self.state_updated.release() def __str__(self): - s = "domain" + s = " Created domain=%d name=%s memory=%d', - dom, self.name, self.memory) - if not self.restore: - self.setdom(dom) + id, self.name, self.memory) + self.setdom(id) def openChannel(self, key, local, remote): - """Create a channel to the domain. + """Create a control channel to the domain. If saved info is available recreate the channel. @param key db key for the saved data (if any) @@ -670,6 +680,11 @@ class XendDomainInfo: return chan def eventChannel(self, key): + """Create an event channel to the domain. + If saved info is available recreate the channel. + + @param key db key for the saved data (if any) + """ db = self.db.addChild(key) return EventChannel.restoreFromDB(db, 0, self.id) @@ -832,11 +847,12 @@ class XendDomainInfo: self.state = STATE_VM_OK self.shutdown_pending = None self.restart_check() + self.exportToDB() self.restart_state = STATE_RESTART_BOOTING if self.bootloader: self.config = self.bootloader_config() self.construct(self.config) - self.saveDB() + self.saveToDB() finally: self.restart_state = None @@ -910,23 +926,6 @@ class XendDomainInfo: backend = blkif.getBackend(0) backend.connect(recreate=self.recreate) - def dom_construct(self, dom, config): - """Construct a vm for an existing domain. - - @param dom: domain id - @param config: domain configuration - """ - d = dom_get(dom) - if not d: - raise VmError("Domain not found: %d" % dom) - try: - self.restore = True - self.setdom(dom) - self.memory = d['mem_kb']/1024 - self.construct(config) - finally: - self.restore = False - def configure_fields(self): """Process the vm configuration fields using the registered handlers. """ diff --git a/tools/python/xen/xend/image.py b/tools/python/xen/xend/image.py index e0d70581bf..8d64472e98 100644 --- a/tools/python/xen/xend/image.py +++ b/tools/python/xen/xend/image.py @@ -96,8 +96,8 @@ class ImageHandler: self.db = vm.db.addChild('/image') self.config = config - def exportToDB(self, save=False): - self.db.exportToDB(self, fields=self.__exports__, save=save) + def exportToDB(self, save=False, sync=False): + self.db.exportToDB(self, fields=self.__exports__, save=save, sync=sync) def importFromDB(self): self.db.importFromDB(self, fields=self.__exports__) diff --git a/tools/python/xen/xend/server/blkif.py b/tools/python/xen/xend/server/blkif.py index 75a76e8bda..0b40c30bf3 100755 --- a/tools/python/xen/xend/server/blkif.py +++ b/tools/python/xen/xend/server/blkif.py @@ -167,6 +167,7 @@ class BlkDev(Dev): DBVar('params', ty='str'), DBVar('node', ty='str'), DBVar('device', ty='long'), + DBVar('dev_handle', ty='long'), DBVar('start_sector', ty='long'), DBVar('nr_sectors', ty='long'), ] diff --git a/tools/python/xen/xend/server/channel.py b/tools/python/xen/xend/server/channel.py index 00f451a7b8..defe76f106 100755 --- a/tools/python/xen/xend/server/channel.py +++ b/tools/python/xen/xend/server/channel.py @@ -81,7 +81,7 @@ class EventChannel(dict): evtchn_close(self.dom1, self.port1) evtchn_close(self.dom2, self.port2) - def saveToDB(self, db): + def saveToDB(self, db, save=False): """Save the event channel to the db so it can be restored later, using restoreFromDB() on the class. @@ -91,7 +91,7 @@ class EventChannel(dict): db['dom2'] = str(self.dom2) db['port1'] = str(self.port1) db['port2'] = str(self.port2) - db.saveDB() + db.saveDB(save=save) def sxpr(self): return ['event-channel', @@ -339,7 +339,7 @@ class Channel: # Make sure the port will deliver all the messages. self.port.register(TYPE_WILDCARD) - def saveToDB(self, db): + def saveToDB(self, db, save=False): """Save the channel ports to the db so the channel can be restored later, using restoreFromDB() on the factory. @@ -348,7 +348,7 @@ class Channel: if self.closed: return db['local_port'] = str(self.getLocalPort()) db['remote_port'] = str(self.getRemotePort()) - db.saveDB() + db.saveDB(save=save) def getKey(self): """Get the channel key. diff --git a/tools/python/xen/xend/server/console.py b/tools/python/xen/xend/server/console.py index 743ace4aec..e0aa04a37a 100755 --- a/tools/python/xen/xend/server/console.py +++ b/tools/python/xen/xend/server/console.py @@ -214,7 +214,8 @@ class ConsoleDev(Dev, protocol.ServerFactory): self.unix_listener = reactor.listenUNIX(path, self) if xroot.get_xend_http_server(): interface = xroot.get_console_address() - self.tcp_listener = reactor.listenTCP(self.console_port, self, interface=interface) + self.tcp_listener = reactor.listenTCP( + self.console_port, self, interface=interface) finally: self.lock.release() diff --git a/tools/python/xen/xend/xenstore/xsobj.py b/tools/python/xen/xend/xenstore/xsobj.py index b1c9a4f1d1..cdb35c1735 100644 --- a/tools/python/xen/xend/xenstore/xsobj.py +++ b/tools/python/xen/xend/xenstore/xsobj.py @@ -1,6 +1,8 @@ import string import types +from xen.xend.XendLogging import log + from xen.xend import sxp from xsnode import XenNode from xen.util.mac import macToString, macFromString @@ -14,14 +16,19 @@ def hasAttr(obj, attr): return hasattr(obj, attr) def getAttr(obj, attr): - if isinstance(obj, dict): - return dict.get(attr) - else: - return getattr(obj, attr, None) + try: + if isinstance(obj, dict): + return obj.get(attr) + else: + return getattr(obj, attr, None) + except AttributeError: + return None + except LookupError: + return None def setAttr(obj, attr, val): if isinstance(obj, dict): - dict[attr] = val + obj[attr] = val else: setattr(obj, attr, val) @@ -53,8 +60,8 @@ class DBConverter: convertToDB = classmethod(convertToDB) - def convertFromDB(cls, val, ty=None): - return cls.getConverter(ty).fromDB(val) + def convertFromDB(cls, data, ty=None): + return cls.getConverter(ty).fromDB(data.getData()) convertFromDB = classmethod(convertFromDB) @@ -201,9 +208,8 @@ class DBVar: setAttr(o, self.attr, val) def getDB(self, db): - try: - data = getattr(db, self.path) - except AttributeError: + data = getAttr(db, self.path) + if data is None: return None return DBConverter.convertFromDB(data, ty=self.ty) @@ -214,8 +220,7 @@ class DBVar: return data = DBConverter.convertToDB(val, ty=self.ty) #print 'DBVar>setDB>', self.path, 'data=', data - setattr(db, self.path, data) - + setAttr(db, self.path, data) class DBMap(dict): """A persistent map. Extends dict with persistence. -- 2.30.2